﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Gallio.Framework;
using MbUnit.Framework;
using MbUnit.Framework.ContractVerifiers;
using MVCScaffold.Extensions;
using MVCScaffold.GeradoresDeCodigo;
using MVCScaffold.GerenciadoresContexto;
using MVCScaffold.Tests.Suporte;

namespace MVCScaffold.Tests
{
    [TestFixture]
    public class Template_Controller_a_Partir_Edmx
    {
        public Template_Controller_a_Partir_Edmx()
        {
            PrepararArquivosProjeto.Preparar();
            _gerenciadorProjeto = new GerenciadorArquivoProjeto(Path.Combine(Properties.Resources.DiretorioOut, "arquivo.csproj"));
            _gerenciadorContexto = new GerenciadorEdmx(Path.Combine(Properties.Resources.DiretorioOut, "arquivo.edmx"));
        }

        readonly GerenciadorArquivoProjeto _gerenciadorProjeto;
        readonly GerenciadorContexto _gerenciadorContexto;


        [Test]
        public void Quando_Arquivo_Template_Nao_For_Encontrado()
        {
            //Arrange
            var gerenciadorTemplate = new GeradorCSharp(_gerenciadorContexto, _gerenciadorProjeto, Properties.Resources.DiretorioOut);
            if (File.Exists(Path.Combine(Properties.Resources.DiretorioOut, @"CSharp\Controller.tt")))
                File.Delete(Path.Combine(Properties.Resources.DiretorioOut, @"CSharp\Controller.tt"));

            //Act 
            gerenciadorTemplate.GerarControllers();

            //Assert
            Assert.AreEqual(11, gerenciadorTemplate.QuantidadeControllers);
        }

        [Test]
        public void Quando_Codigo_Gerado_Com_Sucesso()
        {
            //Arrange
            PrepararArquivosTemplate.CriarArquivosTemplate("Controller.tt");
            var gerenciadorTemplate = new GeradorCSharp(_gerenciadorContexto, _gerenciadorProjeto, Properties.Resources.DiretorioOut);

            //Act 
            gerenciadorTemplate.GerarControllers();

            //Assert
            Assert.AreEqual(11, gerenciadorTemplate.QuantidadeControllers);
        }

        [Test]
        [ExpectedException(typeof(MvcScaffoldTextTemplateHostException))]
        public void Quando_Template_Conter_Erro()
        {
            //Arrange
            PrepararArquivosTemplate.CriarArquivosTemplate("<template>", "Controller.tt");
            var gerenciadorTemplate = new GeradorCSharp(_gerenciadorContexto, _gerenciadorProjeto, Properties.Resources.DiretorioOut);

            //Act 
            gerenciadorTemplate.GerarControllers();
        }
    }

    [TestFixture]
    public class Template_View_Create_a_Partir_Edmx
    {
        public Template_View_Create_a_Partir_Edmx()
        {
            PrepararArquivosProjeto.Preparar();
            _gerenciadorProjeto = new GerenciadorArquivoProjeto(Path.Combine(Properties.Resources.DiretorioOut, "arquivo.csproj"));
            _gerenciadorContexto = new GerenciadorEdmx(Path.Combine(Properties.Resources.DiretorioOut, "arquivo.edmx"));
        }

        readonly GerenciadorArquivoProjeto _gerenciadorProjeto;
        readonly GerenciadorContexto _gerenciadorContexto;

        [Test]
        public void Quando_Codigo_Gerado_Com_Sucesso()
        {
            //Arrange
            PrepararArquivosTemplate.CriarArquivosTemplate("Create.tt");
            var gerenciadorTemplate = new GeradorCSharp(_gerenciadorContexto, _gerenciadorProjeto, Properties.Resources.DiretorioOut);

            //Act 
            gerenciadorTemplate.GerarViewCreate();

            //Assert
            Assert.AreEqual(11, gerenciadorTemplate.QuantidadeControllers);
        }
    }
}
